package com.dh.design.abstractFactory;

/**
 * @author dh
 * @date 2020/10/31 15:09
 * @Description: 抽象工厂模式
 * 步骤一：为形状创建一个接口（Shape）
 * 步骤二：创建实现接口的实体类（Rectangle、Square、Circle）
 * 步骤三：为颜色创建一个接口（Color）
 * 步骤四：创建实现颜色接口的实体类（Red、Green、Blue）
 * 步骤五：为 Color 和 Shape 对象创建抽象类来获取工厂（AbstractFactory）
 * 步骤六：创建扩展了 AbstractFactory 的工厂类，基于给定的信息生成实体类的对象（ShapeFactory、ColorFactory）
 * 步骤七：创建一个工厂创造器/生成器类，通过传递形状或颜色信息来获取工厂（FactoryProducer）
 * 步骤八：使用 FactoryProducer 来获取 AbstractFactory，通过传递类型信息来获取实体类的对象。
 *
 */
public class AbstractFactoryPatternDemo {

    public static void main(String[] args) {
        //获取形状工厂
        AbstractFactory shape = FactoryProducer.getAbstractFactory("shape");

        //获取 Rectangle 的对象，并调用它的 draw 方法
        Shape rectangle = shape.getShape("Rectangle");
        rectangle.draw();

        //获取 Square 的对象，并调用它的 draw 方法
        Shape square = shape.getShape("Square");
        square.draw();

        //获取 Circle 的对象，并调用它的 draw 方法
        Shape circle = shape.getShape("Circle");
        circle.draw();


        //获取颜色工厂
        AbstractFactory color = FactoryProducer.getAbstractFactory("color");

        //获取 Red 的对象，并调用它的 fill 方法
        Color red = color.getColor("RED");
        red.fill();

        //获取 Green 的对象，并调用它的 fill 方法
        Color green = color.getColor("GREEN");
        green.fill();

        //获取 Blue 的对象，并调用它的 fill 方法
        Color blue = color.getColor("BLUE");
        blue.fill();
    }
}
